<!DOCTYPE html>
<html>
<head>
	<meta charset="utf-8">
	<meta http-equiv="X-UA-Compatible" content="IE=edge">
	<title>js 空数组是true还是false</title>
	<link rel="stylesheet" href="">
</head>
<body>
<script>
var arr = new Array();  // 或 var arr = [];
console.log(typeof arr); // "object"

// 既然是object，用于判断条件时就会被转化为true
if(arr){
	console.log(true)
}

// 但是，如果将arr与布尔值比较：
console.log(arr == false);   // true
console.log(arr == true);    // false

// 可是，如果把arr转化为Boolean，的确是true：
console.log(Boolean(arr))

/**
那arr与布尔值比较时，到底发生了什么？ 
原来，任意值与布尔值比较，都会将两边的值转化为Number。 
如arr与false比较，false转化为0，而arr为空数组，也转化为0：
 */
console.log(Number(false));
console.log(Number(arr));


console.log([] == ![]);  // true
console.log(![])//false

/**
如何避免数组与布尔值比较时出现的坑呢？可以先把数组转化为布尔值：
 */

console.log(Boolean(arr) == true);   // true

console.log(new Array() == []);  //false
console.log(new Array() == new Array());   //false

// 但有个问题很奇怪：
console.log(new Array(1) == false);
console.log(new Array(1)) //[empty]
console.log(new Array(2)) //[empty,empty]
console.log(new Array(1,2,3,4)) //[1,2,3,4]
                                //
// true
console.log(new Array(2) == false) //false
console.log(new Array(2) == true) // true
console.log(new Array(0) == false) // true
// 或
console.log(new Array(1,2,3) == true) //false
console.log([undefined] == false);
// true
</script>
</body>
</html>